import { standingCarCurrent } from '@/api/oa/handle'

const ruler = {
  phone (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^1[0-9]{10}$/
    if (!zz.test(value)) {
      callback(new Error('号码格式错误'))
    } else {
      callback()
    }
  },
  email (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
    if (!zz.test(value)) {
      callback(new Error('邮箱格式错误'))
    } else {
      callback()
    }
  },
  idCard (rule, value, callback) {
    if (value === undefined || value === '') callback()
    var num = value.toUpperCase()
    // 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X。
    var reg = /^(\d{18,18}|\d{15,15}|\d{17,17}X)$/
    if (!reg.test(num)) {
      callback(new Error('身份证格式错误'))
    }
    // 校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
    // 下面分别分析出生日期和校验位
    var len, re
    len = num.length
    if (len === 15) {
      re = new RegExp(
        /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/)
      var arrSplit = num.match(re)
      // 检查生日日期是否正确
      var dtmBirth = new Date('19' + arrSplit[2] +
          '/' + arrSplit[3] + '/' + arrSplit[4])
      var bGoodDay
      bGoodDay = (dtmBirth.getYear() === Number(arrSplit[2])) &&
          ((dtmBirth.getMonth() + 1) === Number(arrSplit[3])) &&
          (dtmBirth.getDate() === Number(arrSplit[4]))
      if (!bGoodDay) {
        callback(new Error('身份证格式错误'))
      }
    }
    if (len === 18) {
      re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/)
      let arrSplit = num.match(re)
      // 检查生日日期是否正确
      let dtmBirth = new Date(arrSplit[2] + '/' +
          arrSplit[3] + '/' + arrSplit[4])
      let bGoodDay
      bGoodDay = (dtmBirth.getFullYear() === Number(arrSplit[2])) &&
          ((dtmBirth.getMonth() + 1) === Number(arrSplit[3])) &&
          (dtmBirth.getDate() === Number(arrSplit[4]))
      if (!bGoodDay) {
        callback(new Error('身份证格式错误'))
      } else {
        // 检验18位身份证的校验码是否正确。
        // 校验位按照ISO 7064:1983.MOD
        // 11-2的规定生成，X可以认为是数字10。
        let valnum
        let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
        let nTemp = 0
        for (let i = 0; i < 17; i++) {
          nTemp += num.substr(i, 1) * arrInt[i]
        }
        valnum = arrCh[nTemp % 11]
        if (valnum !== num.substr(17, 1)) {
          callback(new Error('身份证格式错误'))
        }
      }
    }
    callback()
  },
  idNoFormatCheck (value) {
    var num = value.toUpperCase()
    // 身份证号码为15位或者18位，15位时全为数字，18位前17位为数字，最后一位是校验位，可能为数字或字符X。
    var reg = /^(\d{18,18}|\d{15,15}|\d{17,17}X)$/
    if (!reg.test(num)) {
      return false
    }
    // 校验位按照ISO 7064:1983.MOD 11-2的规定生成，X可以认为是数字10。
    // 下面分别分析出生日期和校验位
    var len, re
    len = num.length
    if (len === 15) {
      re = new RegExp(
        /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/)
      var arrSplit = num.match(re)
      // 检查生日日期是否正确
      var dtmBirth = new Date('19' + arrSplit[2] +
        '/' + arrSplit[3] + '/' + arrSplit[4])
      var bGoodDay
      bGoodDay = (dtmBirth.getYear() === Number(arrSplit[2])) &&
        ((dtmBirth.getMonth() + 1) === Number(arrSplit[3])) &&
        (dtmBirth.getDate() === Number(arrSplit[4]))
      if (!bGoodDay) {
        return false
      }
    }
    if (len === 18) {
      re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/)
      let arrSplit = num.match(re)
      // 检查生日日期是否正确
      let dtmBirth = new Date(arrSplit[2] + '/' +
        arrSplit[3] + '/' + arrSplit[4])
      let bGoodDay
      bGoodDay = (dtmBirth.getFullYear() === Number(arrSplit[2])) &&
        ((dtmBirth.getMonth() + 1) === Number(arrSplit[3])) &&
        (dtmBirth.getDate() === Number(arrSplit[4]))
      if (!bGoodDay) {
        return false
      } else {
        // 检验18位身份证的校验码是否正确。
        // 校验位按照ISO 7064:1983.MOD
        // 11-2的规定生成，X可以认为是数字10。
        let valnum
        let arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        let arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
        let nTemp = 0
        for (let i = 0; i < 17; i++) {
          nTemp += num.substr(i, 1) * arrInt[i]
        }
        valnum = arrCh[nTemp % 11]
        if (valnum !== num.substr(17, 1)) {
          return false
        }
      }
    }
    return true
  },
  url (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i
    if (!zz.test(value)) {
      callback(new Error('Url格式错误'))
    } else {
      callback()
    }
  },
  // 汉字 1-10 个中文
  chinese10 (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^[\u4e00-\u9fa5]{1,10}$/
    if (!zz.test(value)) {
      callback(new Error('输入需符合1-10个汉字'))
    } else {
      callback()
    }
  },
  // 汉字 1-50 个中文
  chinese50 (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^[\u4e00-\u9fa5]{1,50}$/
    if (!zz.test(value)) {
      callback(new Error('输入需符合1-50个汉字'))
    } else {
      callback()
    }
  },
  // 密码 6-18 数字/字母
  password (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^[a-z0-9]{6,18}$/
    if (!zz.test(value)) {
      callback(new Error('输入需符合6-18位数字或字母'))
    } else {
      callback()
    }
  },
  // 车牌号正则
  license (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]{1}[A-HJ-NP-Z]{1}(?:(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))|[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1})$/
    if (!zz.test(value)) {
      callback(new Error('车牌号格式错误'))
    } else {
      standingCarCurrent().then(req => {
        let findex = req.data.findIndex(e => e.carPlate === value)
        if (findex !== -1) {
          callback(new Error('该车牌号已存在'))
        } else {
          callback()
        }
      })
    }
  },
  // 只能输入数字
  number (rule, value, callback) {
    if (value === undefined || value === '') callback()
    const zz = /^\d+$/
    if (!zz.test(value)) {
      callback(new Error('格式错误,请输入数字'))
    } else {
      callback()
    }
  },
  // 只能输入 1 - 30位数字
  number1_30 (rule, value, callback) {
    if (value === undefined || value === '') callback()
    // value = value.replace(/\s+/g, '')

    if (value.substr(0, 1) === '0') {
      callback(new Error('格式错误,首字符不能为0'))
    }
    const zz = /^\d{1,30}$/
    if (!zz.test(value)) {
      callback(new Error('格式错误,请输入数字且1~30位数字'))
    } else {
      callback()
    }
  }

}

export default ruler
